package top.continew.wechat.common.util;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.Method;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;

/**
 * HTTP工具类
 */
@Slf4j
public class HttpUtil {

    /**
     * 发送GET请求
     *
     * @param url 请求URL
     * @return 响应内容
     */
    public static String get(String url) {
        return get(url, null, null);
    }

    /**
     * 发送GET请求
     *
     * @param url    请求URL
     * @param params 请求参数
     * @return 响应内容
     */
    public static String get(String url, Map<String, Object> params) {
        return get(url, params, null);
    }

    /**
     * 发送GET请求
     *
     * @param url     请求URL
     * @param params  请求参数
     * @param headers 请求头
     * @return 响应内容
     */
    public static String get(String url, Map<String, Object> params, Map<String, String> headers) {
        return request(Method.GET, url, params, null, headers);
    }

    /**
     * 发送POST请求
     *
     * @param url 请求URL
     * @return 响应内容
     */
    public static String post(String url) {
        return post(url, null, null);
    }

    /**
     * 发送POST请求
     *
     * @param url  请求URL
     * @param body 请求体
     * @return 响应内容
     */
    public static String post(String url, String body) {
        return post(url, body, null);
    }

    /**
     * 发送POST请求
     *
     * @param url     请求URL
     * @param body    请求体
     * @param headers 请求头
     * @return 响应内容
     */
    public static String post(String url, String body, Map<String, String> headers) {
        return request(Method.POST, url, null, body, headers);
    }

    /**
     * 发送PUT请求
     *
     * @param url  请求URL
     * @param body 请求体
     * @return 响应内容
     */
    public static String put(String url, String body) {
        return put(url, body, null);
    }

    /**
     * 发送PUT请求
     *
     * @param url     请求URL
     * @param body    请求体
     * @param headers 请求头
     * @return 响应内容
     */
    public static String put(String url, String body, Map<String, String> headers) {
        return request(Method.PUT, url, null, body, headers);
    }

    /**
     * 发送DELETE请求
     *
     * @param url 请求URL
     * @return 响应内容
     */
    public static String delete(String url) {
        return delete(url, null);
    }

    /**
     * 发送DELETE请求
     *
     * @param url     请求URL
     * @param headers 请求头
     * @return 响应内容
     */
    public static String delete(String url, Map<String, String> headers) {
        return request(Method.DELETE, url, null, null, headers);
    }

    /**
     * 发送HTTP请求
     *
     * @param method  请求方法
     * @param url     请求URL
     * @param params  请求参数
     * @param body    请求体
     * @param headers 请求头
     * @return 响应内容
     */
    public static String request(Method method, String url, Map<String, Object> params, String body, Map<String, String> headers) {
        try {
            // 创建请求
            HttpRequest request = cn.hutool.http.HttpUtil.createRequest(method, url);

            // 设置请求参数
            if (params != null && !params.isEmpty()) {
                request.form(params);
            }

            // 设置请求体
            if (body != null) {
                request.body(body);
            }

            // 设置请求头
            if (headers != null && !headers.isEmpty()) {
                request.headerMap(headers, true);
            }

            // 发送请求
            HttpResponse response = request.execute();

            // 返回响应内容
            return response.body();
        } catch (Exception e) {
            log.error("HTTP请求异常：{}", e.getMessage(), e);
            throw new RuntimeException("HTTP请求异常：" + e.getMessage(), e);
        }
    }
}
